Jaka jest najszybsza metoda konwersji java.nio.ByteBuffer a na (nowo utworzony) CharBuffer b lub char [] b. Robiąc to, ważne jest, aby a [i] == b [i]. Oznacza to, że nie a [i] i a [i + 1] razem tworzą wartość b [j], co zrobiłoby getChar (i), ale wartości powinny być „rozłożone”. byte a [] = {1,2,3, 125,126,127, -128, -127, -126} // każdy bajt (które są podpisane) char b [] = {1, 2, 3, 125, 126, 127, 128, 129, 130} // każdy znak (bez znaku) Zauważ, że bajt: -128 ma takie same (8 dolnych) bitów jak znak: 128. Dlatego zakładam, że „najlepsza” interpretacja byłaby taka, jak wskazałem powyżej, ponieważ bity są takie same. Potem potrzebuję również odwrotnego tłumaczenia: Najbardziej efektywny sposób na przywrócenie char [] lub java.nio.CharBuffer do java.nio.ByteBuffer.
2021-01-06 08:19:50
Więc to, co chcesz, to przekonwertować za pomocą kodowania ISO-8859-1. Nie twierdzę nic o wydajności, ale przynajmniej napisać to dość krótko: CharBuffer result = Charset.forName ("ISO-8859-1"). Decode (byteBuffer); Innym kierunkiem byłoby: ByteBuffer result = Zestaw znaków.forName ("ISO-8859-1"). Encode (charBuffer); Proszę porównać to z innymi rozwiązaniami. (Aby być uczciwym, część Charset.forName nie powinna być dołączana, a także powinna być wykonana tylko raz, a nie dla każdego bufora ponownie). Począwszy od Java 7 dostępna jest również klasa StandardCharsets z wstępnie utworzonymi instancjami Charset, więc możesz używać CharBuffer result = StandardCharsets.ISO_8859_1.decode (byteBuffer); i ByteBuffer result = StandardCharsets.ISO_8859_1.encode (charBuffer); zamiast. (Te wiersze działają tak samo jak poprzednie, tylko wyszukiwanie jest łatwiejsze i nie ma ryzyka błędnego wpisania nazw i nie ma potrzeby przechwytywania niemożliwych wyjątków). | Zgodziłbym się z @ Ishtar, sugerując, aby w ogóle unikać konwersji do nowej struktury i konwertować tylko wtedy, gdy tego potrzebujesz. Jeśli jednak masz ByteBuffer sterty, możesz to zrobić. ByteBuffer bb = ... byte [] tablica = bb.array (); char [] chars = new char [bb.remaining ()]; for (int i = 0; i